package com.hca.training.zk.javabasic.Stringtest.Stringtest;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.List;


public class TestClass {

    public static void main(String[] arg0) {
//        output(new Date());//1、	写一个output方法，输出对象具体的内容，并打印到控制台，注意不是Java标准的toString方法输出的内容。
//        Mythod();//4、	打印输出某一个类的全路径 .5、	打印输出某一个类中的所有方法名、属性名
//        Subclass();//6.	判定某一个对象是否为指定的类的子类
//          Array();

    }

    /**\
     * 1、	写一个output方法，输出对象具体的内容，并打印到控制台，注意不是Java标准的toString方法输出的内容。
     * 例如：Calendar或Date对象输出格式化后的日期文本；一个List则输出每一个元素的内容；
     * 一个Map则输出所有的key和value；如某一个类实在无法输出内容，则输出标准的toString方法输出的内容。
     */
    public static void output(Date date)
    {
        String s=(new SimpleDateFormat("yyyy-MM-dd")).format(date);
        System.out.println(s);
    }
    /**
     * 2、	创建一套性别enum，并指定enum的key，男为M，女为F，不详为U。
     */
     private  enum Sex{ man("男","M"),woman("女","F"),uncertainty("不详","U");
         private final String key;
         private final String value;
          Sex(String key,String value ) {
             this.key = key;
             this.value=value;
         }
     };
/**
   4、	打印输出某一个类的全路径名
   5、	打印输出某一个类中的所有方法名、属性名
 */
public static void Mythod()
{
    //4.打印输出某一个类的全路径名
           String a=TestClass.class.getClassLoader().getResource("").getPath();

    //5.打印输出某一个类中的所有方法名、属性名
       System.out.println(TestClass.class.getClassLoader().getResource("").getPath());
    try {
        Class b = Class.forName("java.util.Date");
         Field[] ss= b.getDeclaredFields();
        for (Field ac : ss)
        {
            System.out.println("属性名："+ac.getName());
        }
        Method[] s = b.getMethods();
        for (Method aa : s)
        {
            System.out.println("方法名："+aa.getName());
        }

    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }
}
/**
 * 6、	判定某一个对象是否为指定的类的子类
 */
public static void Subclass()
{
    Class clazzA = ss.class;
    Class clazzB = TestClass.class;
    boolean isFather = clazzB.isAssignableFrom(clazzA);
    if(isFather){
        System.out.println("B是A的父类");
    }else{
        System.out.println("B不是A的父类");
    }
}
/**
 * 7.	判定某一个对象是否为数组（至少写出两种方式）
 */
public static void Array()
{
 //第一种
    Class type = TestArray.class;
    System.out.println(type.isArray());
    //第二种
    //  if (type instanceof String[]) 是先转换成该类型，不能转换则抛出异常
    int[] a = new int[4];
    System.out.println(a instanceof Object);
}
/**
 * 8、反射获取对象
 */
public static void  getClasses() throws ClassNotFoundException, IllegalAccessException, InstantiationException {
    ss type =(ss) Class.forName("com.hca.training.zk.javabasic.Stringtest.Stringtest.ss").newInstance();
       ss.getsss();
}
/**
 * 9.已知某个类的类名和其中的方法名，使用Class类中的invoke方法反射调用该方法，在调用时会抛出哪些异常？分别在什么情况下会抛出这些异常？
 */
public  static  void  getException() {
    try {
        Class b = Class.forName("java.util.Date");
         Method c =b.getDeclaredMethod("getMinutes");
         System.out.println(c);
        Object bObj = Class.forName("java.util.Date").newInstance();//父类实例
        Object o= c.invoke(bObj);
          o.getClass().getMethods();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    }


}



}
class  ss extends TestClass
{
    public static void  getsss()
    {
        System.out.println("获取到该类");
    }
}
/**
 * * 3、	写一个VO类，重写clone方法。
 */

class  VO implements Cloneable
{
      public Object  clone()throws CloneNotSupportedException
      {
          VO cloned = (VO)super.clone();
          return  cloned;
      }

}
